package com.example.service;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.MD5;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.common.jwt.JwtTokenUtils;
import com.example.common.utils.MinioConfig;
import com.example.dao.UserMapper;
import com.example.entity.User;
import com.example.entity.Params;
import com.example.common.exception.CustomException;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private MinioConfig minioConfig;


    // 查询所有用户
    public List<User> findAll() {
        return userMapper.selectList(null); // 使用 MyBatis-Plus 提供的查询方法
    }

    // 分页查询
    public PageInfo<User> findBySearch(Params params) {
        // 开启分页查询
        PageHelper.startPage(params.getPageNum(), params.getPageSize());
        // 查询用户
        List<User> list = userMapper.findBySearch(params);
        return PageInfo.of(list);
    }

    // 添加用户
    public void add(User admin) {
        // 1. 用户名一定要有，否则不让新增（后面需要用户名登录）
        if (admin.getName() == null || "".equals(admin.getName())) {
            throw new CustomException("用户名不能为空");
        }
        // 2. 进行重复性判断，同一名字的管理员不允许重复新增
        User user = userMapper.findByName(admin.getName());
        if (user != null) {
            throw new CustomException("该用户名已存在，请更换用户名");
        }
        // 初始化一个密码
        if (admin.getPassword() == null) {
            // 这里使用MD5加密密码
            admin.setPassword(MD5.create().digestHex("123456".getBytes())); // 设置默认密码并加密
        } else {
            // 如果有密码，直接加密
            admin.setPassword(MD5.create().digestHex(admin.getPassword().getBytes()));
        }

        if (ObjectUtil.isEmpty(admin.getAvatar())) {
            admin.setAvatar(null);
        }
        // 使用 MyBatis-Plus 提供的 insert 方法
        this.save(admin); // save 方法会自动进行插入操作
    }


    // 更新用户信息
    public void update(User user) {
        // 使用 MyBatis-Plus 提供的 update 方法
        this.updateById(user); // updateById 会自动根据 ID 更新记录
    }

    // 删除用户
    public void delete(Integer id) {
        // 使用 MyBatis-Plus 提供的 delete 方法
        this.removeById(id); // removeById 会自动根据 ID 删除记录
    }

    // 用户登录
    public User login(User admin) {
        // 1. 进行非空判断
        if (admin.getName() == null || admin.getName().isEmpty()) {
            throw new CustomException("用户名不能为空");
        }
        if (admin.getPassword() == null || admin.getPassword().isEmpty()) {
            throw new CustomException("密码不能为空");
        }

        // 2. 查询用户信息（不使用密码查询，避免安全问题）
        User user = userMapper.findByName(admin.getName());
        if (user == null) {
            throw new CustomException("用户名或密码错误");
        }

        // 3. 比对密码
        String encryptedPassword = MD5.create().digestHex(admin.getPassword());
        if (!user.getPassword().equals(encryptedPassword)) {
            throw new CustomException("密码错误");
        }
        // 生成该登录用户对应的 token
        String token = JwtTokenUtils.genToken(user.getId().toString(), user.getPassword());
        user.setToken(token);
        return user;
    }

    // 根据 ID 查找用户
        public User findById (Integer id){
            // 使用 MyBatis-Plus 提供的 selectById 方法
            return this.getById(id); // getById 会自动根据 ID 查找记录
        }

        public void upload (MultipartFile file, String username){
            try {
                // 使用 MinioConfig 上传文件
                String fileUrl = minioConfig.putObject(file);

                // 打印文件 URL（可以用来调试）
                System.out.println(fileUrl);
                System.out.println(username);
                // 使用 UpdateWrapper 指定更新头像字段
                UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
                updateWrapper.eq("name", username)  // 指定当前用户的 ID
                        .set("avatar", fileUrl);  // 设置新的头像 URL

                // 执行更新操作，只更新头像字段
                this.update(updateWrapper);

            } catch (Exception e) {
                // 发生异常时抛出自定义异常
                throw new CustomException("文件上传失败: " + e.getMessage());
            }
        }


    }
